package com.saver.core.persistence;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import com.saver.core.domain.CategoriaEquiv;
import com.saver.core.processor.util.Util;
import com.saver.core.util.Constantes;

public class CategoriaEquivSQLite extends DatabaseHelper {
	
	private static final String TAG = "CategoriaEquivSQLite";
	private static final String TABLA = "CATEGORIAS_EQUIV";
	private static final String COL_ID_CATEGORIA_EQUIV = "ID_CATEGORIA_EQUIV";
	private static final String COL_ID_CATEGORIA = "ID_CATEGORIA";
	private static final String COL_NOMBRE = "NOMBRE";
	private static final String COL_ID_SERVIDOR = "ID_SERVIDOR";
	private static final String COL_EXPRESION = "EXPRESION";
	private static final String COL_ID_BANCO = "ID_BANCO";
	
	private static final String[] COLUMNAS = new String []{COL_ID_CATEGORIA_EQUIV, 
		COL_ID_CATEGORIA, COL_ID_SERVIDOR, COL_NOMBRE, COL_EXPRESION, COL_ID_BANCO};

	public CategoriaEquivSQLite (Context context) {
		super(context, Constantes.DATABASE_NAME, null, Constantes.DATABASE_VERSION);
	}
	
	public void guardar (CategoriaEquiv categoriaEquiv) {
		SQLiteDatabase db = getWritableDatabase();
		
		ContentValues values = new ContentValues();
		values.put(COL_ID_CATEGORIA, categoriaEquiv.getIdCategoria());
		values.put(COL_ID_SERVIDOR, categoriaEquiv.getIdServidor());
		values.put(COL_NOMBRE, categoriaEquiv.getNombre());
		values.put(COL_EXPRESION, categoriaEquiv.getExpresion());
		values.put(COL_ID_BANCO, categoriaEquiv.getIdBanco());
		
		int id = (int)db.insert(TABLA, null, values);
		categoriaEquiv.setId(id);
		db.close();
		Log.d(TAG, "CategoriaEquiv guardada");
	}
	
	public void actualizar (CategoriaEquiv categoriaEquiv) {
		Log.d(TAG, "actualizar categoriaEquiv");
		
		SQLiteDatabase db = getWritableDatabase();
		
		ContentValues values = new ContentValues();
		values.put(COL_ID_CATEGORIA, categoriaEquiv.getIdCategoria());
		values.put(COL_ID_SERVIDOR, categoriaEquiv.getIdServidor());
		values.put(COL_NOMBRE, categoriaEquiv.getNombre());
		values.put(COL_EXPRESION, categoriaEquiv.getExpresion());
		values.put(COL_ID_BANCO, categoriaEquiv.getIdBanco());
		
		db.update(TABLA, values, COL_ID_CATEGORIA_EQUIV + "=?", 
				new String[]{categoriaEquiv.getId().toString()});
		
		db.close();
		Log.d(TAG, "categoriaEquiv actuaizada");
	}
	
	public CategoriaEquiv buscarPorId (Integer id) {
		Log.i(TAG, "buscarPorId: " + id);
		
		CategoriaEquiv categoriaEquiv = null;
		if (id != null) {
			SQLiteDatabase db = getReadableDatabase();
			Cursor cursor = db.query(TABLA, COLUMNAS, COL_ID_CATEGORIA_EQUIV + "=?", 
					new String[]{id.toString()}, null, null, null);
			
			if (cursor.moveToNext()) {
				categoriaEquiv = crearCategoriaEquiv(cursor);
			}
			cursor.close();
			db.close();
		}
		return categoriaEquiv;
	}
	
	public CategoriaEquiv buscarPorIdServ (Integer id) {
		Log.i(TAG, "buscarPorIdServ: " + id);
		
		CategoriaEquiv categoriaEquiv = null;
		if (id != null) {
			SQLiteDatabase db = getReadableDatabase();
			Cursor cursor = db.query(TABLA, COLUMNAS, COL_ID_SERVIDOR + "=?", 
					new String[]{id.toString()}, null, null, null);
			
			if (cursor.moveToNext()) {
				categoriaEquiv = crearCategoriaEquiv(cursor);
			}
			cursor.close();
			db.close();
		}
		return categoriaEquiv;
	}
	
	public CategoriaEquiv buscarPorNombre (String nombre) {
		Log.i(TAG, "buscarPorNombre: " + nombre);
		
		CategoriaEquiv categoriaEquiv = null;
		if (!Util.esVacio(nombre)) {
			SQLiteDatabase db = getReadableDatabase();
			Cursor cursor = db.query(TABLA, COLUMNAS, "lower(NOMBRE)=?", new String[]{nombre.toLowerCase()}, null, null, null);
			
			if (cursor.moveToNext()) {
				categoriaEquiv = crearCategoriaEquiv(cursor);
			}
			cursor.close();
			db.close();
		}
		return categoriaEquiv;
	}
	
	public List<CategoriaEquiv> buscarTodo () {
		Log.i(TAG, "buscarTodo");
		
		SQLiteDatabase db = getReadableDatabase();
		Cursor cursor = db.query(TABLA, COLUMNAS, null, null, null, null, null);
		ArrayList<CategoriaEquiv> lista = new ArrayList<CategoriaEquiv>();
		while (cursor.moveToNext()) {
			lista.add(crearCategoriaEquiv(cursor));
		}
		cursor.close();
		db.close();
		return lista;
	}
	
	public List<CategoriaEquiv> buscarTipo (int tipo, int idBanco) {
		Log.i(TAG, "buscarTodo");
		
		SQLiteDatabase db = getReadableDatabase();
		Cursor cursor = db.query(TABLA, COLUMNAS, COL_EXPRESION + "=? and " + COL_ID_BANCO + "=?", 
				new String[]{String.valueOf(tipo), String.valueOf(idBanco)}, null, null, null);
		ArrayList<CategoriaEquiv> lista = new ArrayList<CategoriaEquiv>();
		while (cursor.moveToNext()) {
			lista.add(crearCategoriaEquiv(cursor));
		}
		cursor.close();
		db.close();
		return lista;
	}

	private CategoriaEquiv crearCategoriaEquiv(Cursor cursor) {
		CategoriaEquiv categoriaEquiv = new CategoriaEquiv();
		categoriaEquiv.setId(cursor.getInt(0));
		if (!cursor.isNull(1)) {
			categoriaEquiv.setIdCategoria(cursor.getInt(1));
		}
		if (!cursor.isNull(2)) {
			categoriaEquiv.setIdServidor(cursor.getInt(2));
		}
		categoriaEquiv.setNombre(cursor.getString(3));
		if (!cursor.isNull(4)) {
			categoriaEquiv.setExpresion(cursor.getInt(4));
		}
		if (!cursor.isNull(5)) {
			categoriaEquiv.setIdBanco(cursor.getInt(5));
		}
		return categoriaEquiv;
	}

}
